//package org.cllib.tool;
//
//import org.cllib.constants.Constants;
//import org.cllib.geometry.Polygon;
//import org.cllib.geometry.GeometryUtil.Line;
//import org.eclipse.swt.SWT;
//import org.eclipse.swt.graphics.Color;
//import org.eclipse.swt.graphics.GC;
//import org.eclipse.swt.graphics.Image;
//import org.eclipse.swt.graphics.Point;
//import org.eclipse.swt.graphics.Rectangle;
//import org.eclipse.swt.graphics.Transform;
//import org.eclipse.swt.widgets.Composite;
//import org.eclipse.swt.widgets.Control;
//import org.eclipse.swt.widgets.Display;
//import org.eclipse.swt.widgets.Menu;
//import org.eclipse.swt.widgets.MenuItem;
//
//public class SWTUtil implements Constants{
//	public final static Color COLOR_FLAT_LEFT = Display.getDefault().getSystemColor(SWT.COLOR_CYAN);
//	public final static Color COLOR_FLAT_RIGHT = Display.getDefault().getSystemColor(SWT.COLOR_DARK_YELLOW);
//	public final static Color COLOR_FLAT_TOP = Display.getDefault().getSystemColor(SWT.COLOR_BLUE);
//	public final static Color COLOR_FLAT_BOTTOM = Display.getDefault().getSystemColor(SWT.COLOR_GREEN);
//	
//	public static void drawImage(GC gc , Image image , int x , int y , int transform){
//		Rectangle r = image.getBounds();
//		drawRegion(gc, image, 0, 0, r.width, r.height, transform, x, y);
//	}
//	
//	public static void drawRegion(final GC gc ,final Image image ,final int srcX ,final int srcY ,final int srcWidth ,final int srcHeight ,final int transform ,final int destX ,final int destY){
//		if(gc == null){
//			throw new NullPointerException("null GC");
//		}
//		
//		if(gc.isDisposed()){
//			throw new IllegalArgumentException("disposed GC");
//		}
//		
//		if(image == null){
//			throw new NullPointerException("null image");
//		}
//		
//		if(transform < 0 || transform > 7){
//			throw new IllegalArgumentException("illegal transform[" + transform + "] should be between[0 , 7]");
//		}
//		
//		final Rectangle r = image.getBounds();
//		if(srcX < 0 || srcY < 0 || srcX + srcWidth > r.width || srcY + srcHeight > r.height){
//			throw new IllegalArgumentException("illegal src position");
//		}
//		
//		if(transform == TRANSFORM_NONE){
//			gc.drawImage(image, srcX, srcY, srcWidth, srcHeight, destX, destY, srcWidth, srcHeight);
//		}else{
//			//copy the region to the new image and then 
//			//draw it as a transformed new image
//			final int regionWidth = srcWidth;
//			final int regionHeight = srcHeight; 
//			
//			Image regionImage = new Image(gc.getDevice() , regionWidth , regionHeight);
//			GC regionGC = new GC(regionImage);
//			
//			regionGC.drawImage(image, srcX, srcY, srcWidth, srcHeight, 0, 0, srcWidth, srcHeight);
//			regionGC.dispose();
//			
//			Transform t = new Transform(gc.getDevice());
//			t.translate(destX, destY);
//			
//			switch (transform) {
//			case TRANSFORM_ROTATE_90:
//				t.rotate(90);
//				t.translate(0 , - regionHeight);
//				break;
//			case TRANSFORM_ROTATE_180:
//				t.rotate(180);
//				t.translate(-regionWidth , - regionHeight);
//				break;
//			case TRANSFORM_ROTATE_270:
//				t.rotate(270);
//				t.translate(-regionWidth , 0);
//				break;	
//			case TRANSFORM_HORIZONTAL_MIRROR:
//				t.scale(-1, 1);
//				t.translate(- regionWidth, 0);
//				break;
//			case TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90:
//				t.rotate(90);
//				t.scale(-1, 1);
//				t.translate(- regionWidth, -regionHeight);
//				break;
//			case TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180:
//				t.scale(1, -1);
//				t.translate(0, -regionHeight);
//				break;
//			case TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270:
//				t.rotate(90);
//				t.scale(1, -1);
//				break;	
//			}
//
//			gc.setTransform(t);
//			gc.drawImage(regionImage, 0, 0);
//			t.dispose();
//			gc.setTransform(null);
//		}
//	}
//	
//	public static void drawFlag(GC gc , Point p){
//		drawFlag(gc , p.x , p.y);
//	}
//	
//	public static void drawArrow(GC gc , Line line){
//		int x2 = line.x2;
//		int y2 = line.y2;
//
//		int x1 = line.x1;
//		int y1 = line.y1;
//
//		final int len = 15;
//		int x0 = 0, y0 = 0;
//		double dx , dy;
//
//		double mAB = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);
//		
//		dx = (x2 - x1) * len / java.lang.Math.sqrt(mAB);
//		dy = (y2 - y1) * len / java.lang.Math.sqrt(mAB);
//		
//		x0 = (int) (x2 - dx);
//		y0 = (int) (y2 - dy);
//
//		int x3 , y3 , x4, y4;
//
//		double mCB = (x2 - x0) * (x2 - x0) + (y2 - y0) * (y2 - y0);
//		
//		dx = -(y2 - y0) * len / java.lang.Math.sqrt(mCB);
//		dy = (x2 - x0) * len / java.lang.Math.sqrt(mCB);
//		
//		x3 = (int) (dx + x0);
//		y3 = (int) (dy + y0);
//		
//		x4 = 2 * x0 - x3;
//		y4 = 2 * y0 - y3; 
//
//		int[] pointArray = new int[]{x2 , y2 , x3 , y3 , x4 , y4};
//		
//		fillPolygon(gc, new Polygon(pointArray));
//	}
//	
//	public static void drawPolygon(GC gc , Polygon poly){
//		Color _fg = gc.getForeground();
//		
//		final int[] points = poly.getPoints();
//		for (int i = 0; i < points.length; i+= 2) {
//			final int sx = points[i];
//			final int sy = points[i + 1];
//			
//			final int ex = points[(i + 2) % points.length];
//			final int ey = points[(i + 3) % points.length];
//			
//			drawLine(gc, sx, sy, ex, ey);
//		}
//		
//		gc.setForeground(_fg);
//	}
//	
//	public static void drawFlag(GC gc , int x , int y){
//		final int d = 5;
//		
//		drawLine(gc, x - d , y - d, x + d, y + d);
//		drawLine(gc, x - d , y + d, x + d, y - d);
//		
//		Color _fg = gc.getForeground();
//		
//		gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));
//		gc.drawText("[" + x + " , " + y + "]", x, y, true);
//		
//		gc.setForeground(_fg);
//	}
//	
//	public static void drawLine(GC gc ,int x1 , int y1 ,int x2 , int y2){
//		Display d = Display.getCurrent();
//		Color _fg = gc.getForeground();
//		Color _bg = gc.getBackground();
//		
//		gc.setBackground(d.getSystemColor(SWT.COLOR_RED));
//		if(x1 == x2){
//			gc.fillRectangle(x1, Math.min(y1, y2), 1, Math.abs(y1 - y2) + 1);
//			return;
//		}
//		
//		if(y1 == y2){
//			gc.fillRectangle(Math.min(x1, x2), y1, Math.abs(x1 - x2) + 1, 1);
//			return;
//		}
//		
//		if(Math.abs(y2 - y1) < Math.abs(x2 - x1)){
//			if(x2 < x1){
//				int temp = x1;
//				x1 = x2;
//				x2 = temp;
//				
//				temp = y1;
//				y1 = y2;
//				y2 = temp;
//			}
//			
//			int dy = y2 - y1;
//			int dx = x2 - x1;
//			
//			int x = x1;
//			int y = y1;
//			
//			int yinc = 0;
//			if(dy > 0){
//				yinc = 1;
//			}else if(dy < 0){
//				yinc = -1;
//			}
//			
//			dy = Math.abs(dy);
//			
//			int err = 0;			
//			for (int i = 0; i <= dx; i++) {
//				gc.fillRectangle(x + i, y , 1 , 1);
//				
//				err += dy;
//				
//				if(err >= dx){
//					err -= dx;
//					
//					y = y + yinc;
//				}
//			}
//		}else{
//			if(y2 > y1){
//				int temp = y1;
//				y1 = y2;
//				y2 = temp;
//				
//				temp = x1;
//				x1 = x2;
//				x2 = temp;
//			}
//			
//			int dy = y1 - y2;
//			int dx = x2 - x1;
//			
//			int x = x2;
//			int y = y2;
//			
//			int xinc = 0;
//			if(dx < 0){
//				xinc = 1;
//			}else if(dx > 0){
//				xinc = -1;
//			}
//
//			dx = Math.abs(dx);
//			
//			int err = 0;
//			for (int i = 0; i <= dy; i++) {
//				gc.fillRectangle(x, y + i, 1, 1);
//				
//				err += dx;
//				
//				if(err >= dy){
//					err -= dy;
//					
//					x += xinc;
//				}
//			}
//		}		
//		
//		gc.setForeground(_fg);
//		gc.setBackground(_bg);
//	}
//	
//	public static void fillTriangle(GC gc ,int x1 , int y1 ,int x2 , int y2 , int x3 , int y3){
//		if(x1 == x2){
//			if(x3 > x1){
//				fillFlatLeftTriangle(gc, x3, y3, x1, y1, x2, y2);
//			}else{
//				fillFlatRightTriangle(gc, x3, y3, x1, y1, x2, y2);
//			}
//			
//			return;
//		}
//		
//		if(x1 == x3){
//			if(x2 > x1){
//				fillFlatLeftTriangle(gc, x2, y2, x1, y1, x3, y3);
//			}else{
//				fillFlatRightTriangle(gc, x2, y2, x1, y1, x3, y3);
//			}
//			
//			return;
//		}
//		
//		if(x2 == x3){
//			if(x1 > x2){
//				fillFlatLeftTriangle(gc, x1, y1, x2, y2, x3, y3);
//			}else{
//				fillFlatRightTriangle(gc, x1, y1, x2, y2, x3, y3);
//			}
//			
//			return;
//		}
//		
//		if(y1 == y2){
//			if(y3 > y1){
//				fillFlatTopTriangle(gc, x3, y3, x1, y1, x2, y2);
//			}else{
//				fillFlatBottomTriangle(gc, x3, y3, x1, y1, x2, y2);	
//			}
//			
//			return;
//		}
//		
//		if(y1 == y3){
//			if(y2 > y1){
//				fillFlatTopTriangle(gc, x2, y2, x1, y1, x3, y3);
//			}else{
//				fillFlatBottomTriangle(gc, x2, y2, x1, y1, x3, y3);
//			}
//			
//			return;
//		}
//		
//		if(y2 == y3){
//			if(y1 > y2){
//				fillFlatTopTriangle(gc, x1, y1, x2, y2, x3, y3);
//			}else{
//				fillFlatBottomTriangle(gc, x1, y1, x2, y2, x3, y3);
//			}
//			
//			return;
//		}
//		
//		if(y1 > y2){
//			int temp = x1;
//			x1 = x2;
//			x2 = temp;
//			
//			temp = y1;
//			y1 = y2;
//			y2 = temp;
//		}
//		
//		if(y1 > y3){
//			int temp = x1;
//			x1 = x3;
//			x3 = temp;
//			
//			temp = y1;
//			y1 = y3;
//			y3 = temp;
//		}
//		
//		if(y2 > y3){
//			int temp = x2;
//			x2 = x3;
//			x3 = temp;
//			
//			temp = y2;
//			y2 = y3;
//			y3 = temp;
//		}
//		//f(x , y) = y * (x2 - x1) - x(y2 - y1) + x1 * y2 - x2 * y1
//		int f = y2 * (x3 - x1) - x2 * (y3 - y1) + x1 * y3 - x3 * y1;
//		
//		if(f == 0){
//			drawLine(gc, x1, y1, x3, y3);
//		}else{
//			int y = y2;
//			int x = (y - y1) * (x3 - x1) / (y3 - y1) + x1;;
//			
//			fillFlatBottomTriangle(gc, x1, y1, x2, y2, x, y);
//			fillFlatTopTriangle(gc, x3, y3, x2, y2, x, y);	
//		}
//	}
//	
//	/**
//	 * 	(x2 , y2)
//	 * 
//	 * 
//	 * 
//	 * 				(x1 , y1)
//	 * 
//	 * 
//	 * 	(x3 , y3)
//	 */
//	public static void fillFlatLeftTriangle(GC gc ,int x1 , int y1 ,int x2 , int y2 , int x3 , int y3){
//		Color _bg = gc.getBackground();
//		
//		gc.setBackground(COLOR_FLAT_LEFT);
//		
//		int width = x1 - x2 + 1;
//		
//		if(y2 > y3){
//			int temp = y2;
//			y2 = y3;
//			y3 = temp;
//		}
//		
//		//() * () / () + y1;
//		for (int i = 0; i < width; i++) {
//			int x = x1 - i;
//			
//			int ny2 = (x - x1) * (y2 - y1) / (x2 - x1) + y1;
//			int ny3 = (x - x1) * (y3 - y1) / (x3 - x1) + y1;
//			
//			gc.fillRectangle(x , ny2, 1, ny3 - ny2 + 1);
//		}
//		
////		drawFlag(gc, new Point(x1 , y1));
////		drawFlag(gc, new Point(x2 , y2));
////		drawFlag(gc, new Point(x3 , y3));
//		
//		gc.setBackground(_bg);
//	}
//	
//	
//	/**
//	 * 			(x2 , y2)
//	 * 
//	 * 
//	 * (x1 , y1)
//	 * 
//	 * 
//	 * 			(x3 , y3)
//	 */
//	public static void fillFlatRightTriangle(GC gc ,int x1 , int y1 ,int x2 , int y2 , int x3 , int y3){
//		Color _bg = gc.getBackground();
//		
//		gc.setBackground(COLOR_FLAT_RIGHT);
//		
//		int width = x2 - x1 + 1;
//		
//		if(y2 > y3){
//			int temp = y2;
//			y2 = y3;
//			y3 = temp;
//		}
//		
//		for (int i = 0; i < width; i++) {
//			int x = x1 + i;
//			
//			int ny2 = (x - x1) * (y2 - y1) / (x2 - x1) + y1;
//			int ny3 = (x - x1) * (y3 - y1) / (x3 - x1) + y1;
//			
//			gc.fillRectangle(x , ny2, 1, ny3 - ny2 + 1);
//		}
//		
////		drawFlag(gc, new Point(x1 , y1));
////		drawFlag(gc, new Point(x2 , y2));
////		drawFlag(gc, new Point(x3 , y3));
//		
//		gc.setBackground(_bg);
//	}
//	
//	/**
//	 * (x2 , y2)				(x3 , y3)
//	 * 
//	 * 				(x1 , y1)
//	 * 
//	 */
//	public static void fillFlatTopTriangle(GC gc ,int x1 , int y1 ,int x2 , int y2 , int x3 , int y3){
////		updateInfo("fillFlatTopTriangle [" + x1 + " , " + y1 + "] [" + x2 + " , " + y2 + "] [" + x3 + " , " + y3 + "]");
//		
//		Color _bg = gc.getBackground();
//		
//		gc.setBackground(COLOR_FLAT_TOP);
//		
//		int height = y1 - y2 + 1;
//		
//		if(x2 > x3){
//			int temp = x2;
//			x2 = x3;
//			x3 = temp;
//		}
//		
//		//(y - y1) * (x2 - x1) / (y2 - y1) + x1;
//		for (int i = 0; i < height; i++) {
//			int y = y1 - i;
//			
//			int nx2 = (y - y1) * (x2 - x1) / (y2 - y1) + x1;
//			int nx3 = (y - y1) * (x3 - x1) / (y3 - y1) + x1;
//			
//			gc.fillRectangle(nx2, y, nx3 - nx2 + 1, 1);
//		}
//		
//		gc.setBackground(_bg);
//		
////		drawFlag(gc, new Point(x1 , y1));
////		drawFlag(gc, new Point(x2 , y2));
////		drawFlag(gc, new Point(x3 , y3));
//	}
//
//	/**
//	 * 			(x1 , y1)
//	 * 
//	 * (x2 , y2)		(x3 , y3)
//	 */
//	public static void fillFlatBottomTriangle(GC gc ,int x1 , int y1 ,int x2 , int y2 , int x3 , int y3){
////		updateInfo("fillFlatBottomTriangle [" + x1 + " , " + y1 + "] [" + x2 + " , " + y2 + "] [" + x3 + " , " + y3 + "]");
//		
//		Color _bg = gc.getBackground();
//		
//		gc.setBackground(COLOR_FLAT_BOTTOM);
//		
//		int height = y2 - y1;
//		
//		if(x2 > x3){
//			int temp = x2;
//			x2 = x3;
//			x3 = temp;
//		}
//		
//		for (int i = 0; i < height; i++) {
//			int y = y1 + i;
//			
//			int nx2 = (y - y1) * (x2 - x1) / (y2 - y1) + x1;
//			int nx3 = (y - y1) * (x3 - x1) / (y3 - y1) + x1;
//			
//			gc.fillRectangle(nx2, y, nx3 - nx2 + 1, 1);
//		}
//		
//		gc.setBackground(_bg);
//		
////		drawFlag(gc, new Point(x1 , y1));
////		drawFlag(gc, new Point(x2 , y2));
////		drawFlag(gc, new Point(x3 , y3));
//	}
//	
//	public static void fillPolygon(GC gc ,Polygon p){
//		if(!p.isConvex()){
//			throw new UnsupportedOperationException("unable to render concave polygon :(");
//		}
//		
//		int[] points = p.getPoints();
//		for (int i = 2; i < points.length - 2; i += 2) {
//			fillTriangle(gc, points[0], points[1], points[i], points[i + 1], points[i + 2], points[i + 3]);
//		}
//	}
//	
//	public static void disposeChildren(Composite c){
//		if(c != null && !c.isDisposed()){
//			Control[] children = c.getChildren();
//			for (int i = 0; i < children.length; i++) {
//				Control child = children[i];
//				if(!child.isDisposed()){
//					child.dispose();
//				}
//			}
//		}
//	}
//	
//	public static int getStringWidth(GC gc , String s){
//		int width = 0;
//		
//		for (int i = 0; i < s.length(); i++) {
//			width += gc.getCharWidth(s.charAt(i));
//		}
//		
//		return width;
//	}
//	
//	public static void disposeMenuItems(Menu menu){
//		if(menu != null && !menu.isDisposed()){
//			MenuItem[] items = menu.getItems();
//			if (items != null && items.length > 0) {
//				for (int i = 0; i < items.length; i++) {
//					items[i].dispose();
//				}
//			}			
//		}
//	}
//	
//	public static int[][] TRANSFORM_TABLE = {
//		/*0*/{TRANSFORM_NONE ,TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180 , TRANSFORM_HORIZONTAL_MIRROR ,TRANSFORM_ROTATE_180 , TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270,TRANSFORM_ROTATE_90,TRANSFORM_ROTATE_270,TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90},
//		/*1*/{TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180 , TRANSFORM_NONE , TRANSFORM_ROTATE_180 , TRANSFORM_HORIZONTAL_MIRROR , TRANSFORM_ROTATE_90 , TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270 , TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90 , TRANSFORM_ROTATE_270},
//		/*2*/{TRANSFORM_HORIZONTAL_MIRROR , TRANSFORM_ROTATE_180 , TRANSFORM_NONE , TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180 , TRANSFORM_ROTATE_270 , TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90 , TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270 , TRANSFORM_ROTATE_90},
//		/*3*/{TRANSFORM_ROTATE_180 , TRANSFORM_HORIZONTAL_MIRROR , TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180 , TRANSFORM_NONE , TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90 , TRANSFORM_ROTATE_270 , TRANSFORM_ROTATE_90 , TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270},
//		/*4*/{TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270 , TRANSFORM_ROTATE_270 , TRANSFORM_ROTATE_90 ,  TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90 ,  TRANSFORM_NONE ,  TRANSFORM_HORIZONTAL_MIRROR ,  TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180 ,  TRANSFORM_ROTATE_180},
//		/*5*/{TRANSFORM_ROTATE_90 , TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90 ,  TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270 ,  TRANSFORM_ROTATE_270 ,  TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180 ,  TRANSFORM_ROTATE_180 ,  TRANSFORM_NONE ,  TRANSFORM_HORIZONTAL_MIRROR},
//		/*6*/{TRANSFORM_ROTATE_270 , TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270 ,  TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90 ,  TRANSFORM_ROTATE_90 ,  TRANSFORM_HORIZONTAL_MIRROR ,  TRANSFORM_NONE ,  TRANSFORM_ROTATE_180 ,  TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180},
//		/*7*/{TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90 , TRANSFORM_ROTATE_90 , TRANSFORM_ROTATE_270 ,  TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270 ,  TRANSFORM_ROTATE_180 ,  TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180 ,  TRANSFORM_HORIZONTAL_MIRROR ,  TRANSFORM_NONE}
//	};
//	public static int getTransform(int t1 , int t2){
//		return TRANSFORM_TABLE[t1][t2];
//	}
//}
